﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BusinessLayer;
using Common;

namespace BoletoElectronicoDesktop.AbmRol
{
    public partial class FormAltaRol : FormAddModify
    {
        private dsBoleto.FuncionalidadDataTable dtListFunc;
        private dsBoleto.FuncionalidadDataTable dtSelectedFunc;

        private BoletoElectronicoDesktop.FormAddModify.CallType Uso;
        dsBoleto.RolRow rol;
        /*
        public FormAltaRol()
        {
            InitializeComponent();
        }
        */
        public FormAltaRol(dsBoleto.RolRow selectedRol, Util.Funcionalidad use) :base(use)
        {
            InitializeComponent();
            if (Util.Funcionalidad.RolModificacion.Equals(use))
            {
                Uso = FormAddModify.CallType.Modify;
            }
            else
            {
                Uso = FormAddModify.CallType.Add;
            }
            inicializarFormAltaRol(selectedRol);
            Load += new EventHandler(FormAbmUsuario_Load);
        }

        void FormAbmUsuario_Load(object sender, EventArgs e)
        {
            switch (Uso)
            {
                case BoletoElectronicoDesktop.FormAddModify.CallType.Add:
                    LoadNewForm();
                    break;
                case BoletoElectronicoDesktop.FormAddModify.CallType.Modify:
                    LoadUser(rol.IdRol);
                    break;
                default:
                    break;
            }
        }

        private void LoadUser(int p)
        {
            dtSelectedFunc = BizFuncionalidad.retrieveFuncionalidadesByRol(rol.IdRol);
            selectedFuncionalidades.DataSource = dtSelectedFunc;
            removeSelectedFuncionalidadesFromListFunc();
            inputName.Text = rol.Descripcion.ToString();
        }

        private void LoadNewForm()
        {
            this.selectedFuncionalidades.DataSource = dtSelectedFunc;
        }

        private void removeSelectedFuncionalidadesFromListFunc()
        {
            List<dsBoleto.FuncionalidadRow> items = new List<dsBoleto.FuncionalidadRow>();
            foreach(dsBoleto.FuncionalidadRow row in dtSelectedFunc.Rows)
            {
                foreach (dsBoleto.FuncionalidadRow srow in dtListFunc.Rows)
                {
                    if (row.IdFuncionalidad == srow.IdFuncionalidad)
                    {
                        items.Add(srow);
                        break;
                    }
                }
            }
            items.ForEach(item => dtListFunc.RemoveFuncionalidadRow(item));
        }

        private void inicializarFormAltaRol(dsBoleto.RolRow rol)
        {
            dtSelectedFunc = new dsBoleto.FuncionalidadDataTable();
            dtListFunc = BizFuncionalidad.retrieveFunciones();
            this.listFuncionalidades.DataSource = dtListFunc;
            this.rol = rol;
        }

        private List<int> obtenerListIdFuncionalidades(dsBoleto.FuncionalidadDataTable dt)
        {
            List<int> funcionalidades = new List<int>();
            foreach(dsBoleto.FuncionalidadRow row in dt.Rows)
            {
                funcionalidades.Add(row.IdFuncionalidad);
            }
            return funcionalidades;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            dtListFunc = null;
            dtSelectedFunc = null;
            Dispose();
            Close();
        }

        private void removeFuncionalidad_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in selectedFuncionalidades.SelectedItems)
            {
                dsBoleto.FuncionalidadRow row = (dsBoleto.FuncionalidadRow)item.Row;

                items.Add(item);
                dsBoleto.FuncionalidadRow fr = dtListFunc.NewFuncionalidadRow();
                fr.IdFuncionalidad = row.IdFuncionalidad;
                fr.Descripcion = row.Descripcion;

                dtListFunc.AddFuncionalidadRow(fr);
            }
            items.ForEach(item => dtSelectedFunc.RemoveFuncionalidadRow((dsBoleto.FuncionalidadRow)item.Row));
            listFuncionalidades.ClearSelected();
            selectedFuncionalidades.ClearSelected();
        }

        private void addFuncionalidad_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in listFuncionalidades.SelectedItems)
            {
                dsBoleto.FuncionalidadRow row = (dsBoleto.FuncionalidadRow)item.Row;

                items.Add(item);
                dsBoleto.FuncionalidadRow fr = dtSelectedFunc.NewFuncionalidadRow();
                fr.IdFuncionalidad = row.IdFuncionalidad;
                fr.Descripcion = row.Descripcion;

                dtSelectedFunc.AddFuncionalidadRow(fr);
            }
            items.ForEach(item => dtListFunc.RemoveFuncionalidadRow((dsBoleto.FuncionalidadRow)item.Row));
            listFuncionalidades.ClearSelected();
            selectedFuncionalidades.ClearSelected();
        }

        private void guardar_Click(object sender, EventArgs e)
        {
            FormPrincipal frm = ((FormPrincipal)this.MdiParent);
            if (validarCampos())
            {
                switch (Uso)
                {
                    case BoletoElectronicoDesktop.FormAddModify.CallType.Add:
                        createNewRol();
                        actualizarFormularioInvocador(frm);
                        break;
                    case BoletoElectronicoDesktop.FormAddModify.CallType.Modify:
                        updateCurrentRol();
                        actualizarFormularioInvocador(frm);
                        break;
                    default:
                        break;
                }
            }
        }

        private void actualizarFormularioInvocador(FormPrincipal form)
        {
            if (form.MdiChildren.Any(f => f is FormAbmRol))
            {
                FormAbmRol frm = (FormAbmRol)form.MdiChildren.First(f => f is FormAbmRol);
                frm.buttonBuscar_Click(new Object(), new EventArgs());
            }
        }

        private void updateCurrentRol()
        {
            List<int> sList = obtenerListIdFuncionalidades(dtSelectedFunc);
            bool updated = BizRol.updateRol(rol.IdRol, inputName.Text, sList);
            if (updated)
            {
                MessageBox.Show("Se modificó exitosamente.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
        }

        private void createNewRol()
        {
            List<int> funcionalidades = obtenerListIdFuncionalidades(dtSelectedFunc);
            bool created = BizRol.createNewRol(inputName.Text, funcionalidades);
            if (created)
            {
                MessageBox.Show("Se guardo exitosamente.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Close();
            }
        }

        private bool validarCampos()
        {
            StringBuilder sb = new StringBuilder();
            bool estado = true;
            if (String.IsNullOrEmpty(inputName.Text))
            {
                sb.AppendLine("El campo Nombre es obligatorio.");
                estado = false;
            }
            if (selectedFuncionalidades.Items.Count == 0)
            {
                sb.AppendLine("Debe seleccionar al menos una funcionalidad.");
                estado = false;
            }
            if (!estado)
            {
                MessageBox.Show(sb.ToString(0, sb.Length), "Error",MessageBoxButtons.OK, MessageBoxIcon.Warning);
                
            }
            return estado;
        }
    }
}